import { defineStore } from 'pinia'
import router from '@/router'

import {
  accountLoginRequest,
  requestUserInfoById,
  requestUserMenuByRoleId
} from '@/service/login/login'

import localCache from '@/utils/cache'
import { mapMenusToRoutes, mapMenusToPermissions } from '@/utils/mapMenus'

// 类型
// state
interface ILoginState {
  token: string
  userInfo: any
  userMenus: any
  permissions: string[]
}
// 账号
interface IAccount {
  name: string
  password: string
}

// 仓库
export const useLoginStore = defineStore('login', {
  state: (): ILoginState => ({
    token: '',
    userInfo: {},
    userMenus: [],
    permissions: []
  }),
  actions: {
    /* 保存token的函数
      setToken(token: string) {
      this.token = token // this 指向 useLoginStore
      localCache.setCache('token', token)
    }, */
    setUserMenus(menus: any) {
      this.userMenus = menus // 保存用户菜单到 store
      // 4、注册动态路由 addRoute方法
      const routes = mapMenusToRoutes(menus)
      routes.forEach((route) => {
        router.addRoute('main', route)
      })
      // 获取用户按钮权限 传入menus给这个函数遍历出来
      const permissions = mapMenusToPermissions(menus)
      this.permissions = permissions
    },

    // 账号登录保存信息
    async accountLogin(params: IAccount) {
      // 1、实现登录逻辑
      const loginResult = await accountLoginRequest(params)
      // 从服务器返回结果里面获取到 id、 token
      const { id, token } = loginResult.data
      // 保存token
      this.token = token // pinia可以直接修改state
      localCache.setCache('token', token)

      // 2、请求用户信息
      const userInfoResult = await requestUserInfoById(id)
      // 保存用户信息
      const userInfo = userInfoResult.data
      this.userInfo = userInfo
      localCache.setCache('userInfo', this.userInfo)

      // 3、根据用户id获取 用户菜单
      const userMenusResult = await requestUserMenuByRoleId(
        this.userInfo.role.id
      )
      const userMenus = userMenusResult.data // 获取到的userMenus
      this.setUserMenus(userMenus) // 保存用户菜单
      localCache.setCache('userMenus', userMenus) // 保存用户 角色菜单列表
      // 完成登录跳转首页
      router.push('/main')
    },

    // 初始化调用一次方法 检查本地是否已经有账号相关的缓存
    // 因为store的数据是缓存在内存里面，所以刷新页面就没有了 这时就可以在全局定义一个函数，让他从本地缓存里面每次都取值
    loadLocaLogin(): void {
      const token = localCache.getCache('token') // 先从本地获取token 看有没有值
      if (token) {
        this.token = token
      }
      const userInfo = localCache.getCache('userInfo')
      if (userInfo) {
        this.userInfo = userInfo
      }
      const userMenus = localCache.getCache('userMenus')
      if (userMenus) {
        this.userMenus = userMenus
      }
    }
  },
  getters: {}
})
